package com.loeng.module.infra.dal.mysql.codegen;

import com.loeng.framework.common.pojo.PageResult;
import com.loeng.framework.mybatis.core.mapper.BaseMapperX;
import com.loeng.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.loeng.module.infra.controller.admin.codegen.vo.table.CodegenTablePageReqVO;
import com.loeng.module.infra.dal.dataobject.codegen.CodegenTableDO;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;

/**
 * 代码生成 table 表定义 Mapper
 *
 * @author loeng zhuo
 */
@Mapper
public interface CodegenTableMapper extends BaseMapperX<CodegenTableDO> {

    /**
     * 获得表定义分页
     *
     * @param pageReqVO 分页查询
     * @return 表定义分页
     */
    default PageResult<CodegenTableDO> selectPage(CodegenTablePageReqVO pageReqVO) {
        return selectPage(pageReqVO, new LambdaQueryWrapperX<CodegenTableDO>()
                .likeIfPresent(CodegenTableDO::getTableName, pageReqVO.getTableName())
                .likeIfPresent(CodegenTableDO::getTableComment, pageReqVO.getTableComment())
                .likeIfPresent(CodegenTableDO::getClassName, pageReqVO.getClassName())
                .betweenIfPresent(CodegenTableDO::getCreateTime, pageReqVO.getCreateTime())
                .orderByDesc(CodegenTableDO::getUpdateTime)
        );
    }

    /**
     * 根据数据源配置的编号，获取到对应的表定义列表
     *
     * @param dataSourceConfigId 数据源配置的编号
     * @return 表定义列表
     */
    default List<CodegenTableDO> selectListByDataSourceConfigId(Long dataSourceConfigId) {
        return selectList(CodegenTableDO::getDataSourceConfigId, dataSourceConfigId);
    }

    /**
     * 根据表名称和数据源配置的编号，获取到对应的表定义
     *
     * @param tableName          表名称
     * @param dataSourceConfigId 数据源配置的编号
     * @return 表定义
     */
    default CodegenTableDO selectByTableNameAndDataSourceConfigId(String tableName, Long dataSourceConfigId) {
        return selectOne(CodegenTableDO::getTableName, tableName,
                CodegenTableDO::getDataSourceConfigId, dataSourceConfigId);
    }

    /**
     * 根据模板类型和主表的编号，获取到对应的表定义列表
     *
     * @param templateType 模板类型
     * @param masterTableId 主表的编号
     * @return 表定义列表
     */
    default List<CodegenTableDO> selectListByTemplateTypeAndMasterTableId(Integer templateType, Long masterTableId) {
        return selectList(CodegenTableDO::getTemplateType, templateType, CodegenTableDO::getMasterTableId, masterTableId);
    }

}
